const fs = require('fs').promises;
const path = require('path');

// 处理Markdown内容，规范化格式
function standardizeMarkdown(content) {
  // 分割成行
  const lines = content.split('\n');
  let formattedLines = [];
  let lastLineWasEmpty = true; // 用于跟踪上一行是否为空
  let inCodeBlock = false; // 用于跟踪是否在代码块内
  let inList = false; // 用于跟踪是否在列表内
  let inGeneralInfo = false; // 用于跟踪是否在常规信息部分
  let generalInfoData = []; // 存储常规信息部分的数据
  let inTestCase = false; // 用于跟踪是否在测试样例部分
  let testCaseContent = []; // 存储测试样例代码内容

  for (let line of lines) {
    const trimmedLine = line.trim();
    
    // 处理代码块标记
    if (trimmedLine.startsWith('```')) {
      if (!inCodeBlock && inTestCase) {
        // 忽略测试样例中的代码块开始标记
        continue;
      }
      inCodeBlock = !inCodeBlock;
      formattedLines.push(line);
      continue;
    }

    // 检查是否进入测试样例部分
    if (trimmedLine.startsWith('### Testfile')) {
      inTestCase = true;
      if (!lastLineWasEmpty) {
        formattedLines.push('');
      }
      formattedLines.push(trimmedLine);
      formattedLines.push('');
      formattedLines.push('```java');
      continue;
    }

    // 在代码块内保持原格式
    if (inCodeBlock) {
      formattedLines.push(line);
      continue;
    }

    // 处理测试样例代码
    if (inTestCase && !trimmedLine.startsWith('#')) {
      if (trimmedLine === '') {
        // 移除空行判断，让代码块继续
        formattedLines.push(line);
        testCaseContent.push(line);
      } else {
        formattedLines.push(line);
        testCaseContent.push(line);
      }
      continue;
    }

    // 确保在文件末尾时测试样例代码块被正确关闭
    if (inTestCase && trimmedLine.startsWith('#')) {
      formattedLines.push('```');
      inTestCase = false;
      testCaseContent = [];
    }

    // 如果已经离开测试样例部分，确保代码块被关闭
    if (!inTestCase && testCaseContent.length > 0) {
      formattedLines.push('```');
      testCaseContent = [];
    }

    // 检查是否是列表项
    const isListItem = /^[*-]\s|^\d+\.\s/.test(trimmedLine);
    
    // 处理列表项
    if (isListItem) {
      if (!inList && !lastLineWasEmpty) {
        formattedLines.push('');
      }
      inList = true;
      formattedLines.push(line);
      lastLineWasEmpty = false;
      continue;
    } else if (inList && trimmedLine === '') {
      inList = false;
    }

    // 处理标题
    if (trimmedLine.startsWith('#')) {
      if (trimmedLine.includes('常规信息')) {
        inGeneralInfo = true;
        if (!lastLineWasEmpty) {
          formattedLines.push('');
        }
        formattedLines.push(trimmedLine);
        formattedLines.push('');
        // 添加表头
        formattedLines.push('| 项目 | 描述 |');
        formattedLines.push('| --- | --- |');
        lastLineWasEmpty = true;
        continue;
      } else if (inGeneralInfo) {
        // 结束常规信息部分
        inGeneralInfo = false;
      }
      if (!lastLineWasEmpty) {
        formattedLines.push('');
      }
      formattedLines.push(trimmedLine);
      formattedLines.push('');
      lastLineWasEmpty = true;
      continue;
    } else if (trimmedLine === '修复或避错建议：') {
      // 将'修复或避错建议'提升为二级标题
      if (!lastLineWasEmpty) {
        formattedLines.push('');
      }
      formattedLines.push('## ' + trimmedLine.replace('：', ''));
      formattedLines.push('');
      lastLineWasEmpty = true;
      continue;
    }

    // 处理普通行
    if (trimmedLine === '') {
      if (!lastLineWasEmpty && !inGeneralInfo) {
        formattedLines.push('');
        lastLineWasEmpty = true;
      }
    } else if (inGeneralInfo) {
      // 处理常规信息部分的内容
      if (!trimmedLine.startsWith('|')) {
        generalInfoData.push(trimmedLine);
        if (generalInfoData.length === 2) {
          formattedLines.push(`| ${generalInfoData[0]} | ${generalInfoData[1]} |`);
          generalInfoData = [];
        }
      }
      lastLineWasEmpty = false;
    } else {
      formattedLines.push(trimmedLine);
      lastLineWasEmpty = false;
    }
  }

  // 确保测试样例代码块在文件末尾正确关闭
  if (inTestCase || testCaseContent.length > 0) {
    formattedLines.push('```');
  }

  // 移除末尾多余的空行
  while (formattedLines.length > 0 && formattedLines[formattedLines.length - 1] === '') {
    formattedLines.pop();
  }

  return formattedLines.join('\n');
}

// 转换单个文件
async function convertFile(filePath, outputDir) {
  try {
    // 读取markdown文件
    const content = await fs.readFile(filePath, 'utf-8');
    
    // 标准化内容
    const standardizedContent = standardizeMarkdown(content);
    
    // 创建输出文件路径
    const fileName = path.basename(filePath);
    const outputPath = path.join(outputDir, fileName);
    
    // 写入文件
    await fs.writeFile(outputPath, standardizedContent, 'utf-8');
    console.log(`Successfully standardized ${fileName}`);
  } catch (error) {
    console.error(`Error converting ${filePath}:`, error);
  }
}

// 主函数
async function processMarkdownFiles() {
  try {
    // 创建输出目录
    const outputDir = path.join(__dirname, 'standard-md-files');
    await fs.mkdir(outputDir, { recursive: true });
    
    // 读取files目录
    const filesDir = path.join(__dirname, 'files');
    const files = await fs.readdir(filesDir);
    
    // 过滤出markdown文件并处理
    const mdFiles = files.filter(file => file.endsWith('.md'));
    
    for (const file of mdFiles) {
      await convertFile(path.join(filesDir, file), outputDir);
    }
    
    console.log('All files processed successfully');
  } catch (error) {
    console.error('Error processing files:', error);
    throw error; // 抛出错误以便调用者处理
  }
}

// 导出函数
module.exports = { processMarkdownFiles };

// 如果直接运行此文件，则执行主函数
if (require.main === module) {
  processMarkdownFiles();
}